package testy.server;

import static org.junit.Assert.*;


import org.junit.Before;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;

import baduga.core.Core_Messages;
import baduga.server.Player;
import baduga.server.Serwer;
import baduga.server.Table;


@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class Test_ServerTable {
	
	Serwer srvObj;
	Player pObj, pObj2;
	Table tObj, tObj2;
	
	/**
	 * 0 - P1
	 * 1 - P2
	 * 2 - T1
	 * 3 - T2
	 * 
	 * 
	 */
	String uuID[] = new String[4];
	
	
	
	
	@Before
	public void tearUp() throws Exception {
		
		//Def.
		Object result[];
		
		
		//Init.
		srvObj = new Serwer();
		pObj = new Player("TestGracz");
		pObj2 = new Player("TestGracz2");
		
		
		
		Core_Messages.init();
		
		
		result = srvObj.addPlayer(pObj);

		
		
		if((boolean)result[0])
		{
			uuID[0] = (String) result[1];
		}
		else
		{
			fail("#0 - Problem podczas dodawania gracza #1");
		}
		
		
		result = srvObj.addPlayer(pObj2);


		
		if((boolean)result[0])
		{
			uuID[1] = (String) result[1];
		}
		else
		{
			fail("#0 - Problem podczas dodawania gracza #2");
		}
		
		
		tObj = new Table(new Integer[] {
				2,
				6,
				50,
				1200,
				2000,
				5000,
				300
			}, new String[] {
				"Stół Testowy 2",
				"",
				""
			}, pObj);
			
		
		
	
		
		tObj2 = new Table(new Integer[] {
				2,
				6,
				50,
				1200,
				2000,
				5000,
				300
			}, new String[] {
				"Stół Testowy",
				"",
				""
			}, pObj);
			
		
		
		result = srvObj.addTable(tObj);
		
		if((boolean)result[0])
		{
			uuID[2] = (String) result[1];
		}
		else
		{
			fail("#0 - Problem podczas dodawania Stołu #1");
		}
		
		result = srvObj.addTable(tObj2);
		
		if((boolean)result[0])
		{
			uuID[3] = (String) result[1];
		}
		else
		{
			fail("#0 - Problem podczas dodawania Stołu #2");
		}
		
		
		
		
	}

	@Test
	public void t1TestAddPlayer() {

		//Def.
		Object[] result;
		Player pObj3T;
		
		
		//Init
		pObj3T = new Player("Test_3e");
		
		
		result = srvObj.addPlayer(pObj3T);

		
		
		if(!(boolean)result[0])
		{
			fail("#0 - Problem podczas dodawania gracza #1 | Poza cfg");
		}

		
		
	}

	@Test
	public void t5TestRemovePlayer() {

		//Def.
		Object[] result;
		Player pObj3T;
		
		
		//Init
		pObj3T = new Player("Test_3e");
		
		
		result = srvObj.addPlayer(pObj3T);

		
		
		if(!(boolean)result[0])
		{
			fail("#5 - Problem podczas dodawania gracza #1 | Poza cfg");
		}
		else
		{
		
			//Usuwanie
			
			
			result = srvObj.removePlayer( (String) result[1] );
			
			
			if(!(boolean)result[0])
			{
				fail("#5 - Problem podczas usuwania gracza #1 | Poza cfg");
			}
		}
		
	}

	@Test
	public void t6TestAddTable() {

		//Def.
		Table tmpObj;
		Object result[];
		
		/**
		 *   0  - min. ilość graczy
		 *   X  - aktualna ilość graczy
		 *   2  - max. ilość graczy
		 *   X  - aktualna ilość obserwatorów
		 *   4  - max. ilość obserwatorów
		 *   5  - min ilość żetonów na wejście
		 *   6  - wart. małej w ciemno
		 *   7  - wart. dużej w ciemno
		 *   8 - czas ruchu gracza
		 *   X - nr Rundy
		 */
		
		tmpObj = new Table(new Integer[] {
			2,
			6,
			50,
			1200,
			2000,
			5000,
			300
		}, new String[] {
			"Stół Testowy 3",
			"",
			""
		}, pObj);
		
		result = srvObj.addTable(tmpObj);
		
		if(!(boolean)result[0])
		{
			fail("#0 - Problem podczas dodawania Stołu #1 - \n (" + result[1] + ") Msg: \n" + Core_Messages.getMessage((Integer) result[1]));
		}
		
	}

	@Test
	public void t9TestRemoveTable() {
		
		//Def.
		Object[] result;
		
		
		result = srvObj.removeTable(uuID[3]);
		
		//assertEquals
		
		if((boolean) result[0])
		{
			
			result = srvObj.removeTable(uuID[3]);
			
			
			if((boolean) result[0])
			{
				fail("#9 - Anomalia podczas usuwania stołu.");
			}
			
		}
		else
		{
			fail("#9 - Nie udana próba usunięcia stołu.");
		}
		
		
	}

	/**
	 * Sprawdza mechanizm unikalności nazw
	 * 
	 * Funkcja zwraca true jak jest wolna
	 * 
	 */
	@Test
	public void t4TestCheckPlayerName() {

		
		if(!srvObj.checkPlayerName("TestGraczeasdasdad"))
		{
			fail("#4. Podana nazwa nie jest używana");
		}
		
		
		if(srvObj.checkPlayerName("TestGracz"))
		{
			fail("#4. Podana nazwa jest używana");
		}
		
	}
	
	
	
	/**
	 * sprawdza reakcje na użyte i nie użyte nazwy
	 * 
	 */
	@Test
	public void t8TestCheckTableName() {
		if(!srvObj.checkTableName("Stół Testowy 2e"))
		{
			fail("#8. Podana nazwa nie jest używana");
		}
		
		
		if(srvObj.checkTableName("Stół Testowy 2"))
		{
			fail("#8. Podana nazwa jest używana");
		}
	}

	@Test
	public void t3TestGetPlayerStatus() {
		
		//Def.
		Player tmp2;
		Object[] resultData;
		
		
		if( 0 != srvObj.getPlayerStatus(uuID[1]))
		{
			fail("#3 - Nieprawidłowy domyślny status");
		}
	}

	
	/**
	 * Sprawdza możliwość pobrania gracza
	 * 
	 */
	@Test
	public void t2TestGetPlayer() {
		
		//Def.
		Player tmp2;
		Object[] resultData;
	
		
		resultData = srvObj.getPlayer(uuID[1]);
		
		if((boolean) resultData[0])
		{
			tmp2 = (Player) resultData[1];
			
			assertEquals("Sprawdzenie czy obiekty graczy są porównywalne: ", tmp2, pObj2);
		}
		else
		{
			fail("#2 - Nie udana próba pozyskania gracza z serwera");
		}
		
	}

	
	/**
	 * 
	 * Sprawdza pobieranie stołu
	 * 
	 */
	@Test
	public void t7TestGetTable() {
		//Def.
		Table tmp;
		Object result[];
		
		

		result = srvObj.getTable(uuID[2]);
		
		if((boolean)result[0])
		{
			tmp = (Table) result[1];
			
			
			
			
			
			
		}
		else
		{
			fail("#0 - Problem podczas dodawania Stołu #1 - \n (" + result[1] + ") Msg: \n" + Core_Messages.getMessage((Integer) result[1]));
		}
	}

	@Test
	public void ta1TestGetTableList() {
		Object result[][];
		
		
		
		result = srvObj.getTableList(new int[] {
			50,
			1
		});
		
		if((boolean)result[0][0])
		{
			
			if(result[1].length != (2 * 6))
			{
				fail("#a1 - Nieprawidłowa ilość rekordów - ( " + result[1].length + " )");
			}

			
			
		}
		else
		{
			fail("#a1 - Problem podczas dodawania Stołu #1 - \n (" + result[0][0] + ") Msg: \n" + Core_Messages.getMessage((Integer) result[0][0]));
		}
		
	}

}
